package com.senlingspace.payment.douyin.bean.response;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.io.Serializable;
import java.util.List;

/**
 * 退款查询响应
 *
 * @author lebronjames
 * @date 2024/08/02
 */
@Data
public class DouyinQueryRefundResponse implements Serializable {

    @JsonProperty("data")
    private ResponseData data;

    @JsonProperty("extra")
    private DouyinCommonResponse.Extra extra;

    @EqualsAndHashCode(callSuper = true)
    @Data
    public static class ResponseData extends DouyinCommonResponse.CommonData {
        /**
         * 退款查询结果列表，最多返回50条
         */
        @JsonProperty("refund_list")
        private List<Refund> refundList;
    }

    @Data
    public static class Refund implements Serializable {
        /**
         * 退款审核信息 (交易系统订单退款才有的信息)
         */
        @JsonProperty("merchant_audit_detail")
        private MerchantAuditDetail merchantAuditDetail;

        /**
         * 退款创建时间，13 位毫秒时间戳
         */
        @JsonProperty("create_at")
        private Long createAt;

        /**
         * 退款时间，13 位毫秒时间戳，只有已退款才有退款时间
         */
        @JsonProperty("refund_at")
        private Long refundAt;

        /**
         * 退款状态
         * 退款中- PROCESSING
         * 已退款- SUCCESS
         * 退款失败- FAIL
         */
        @JsonProperty("refund_status")
        private String refundStatus;

        /**
         * 退款金额，单位[分]
         */
        @JsonProperty("refund_total_amount")
        private Integer refundTotalAmount;

        /**
         * 商品单信息 (交易系统订单退款才有的信息)
         */
        @JsonProperty("item_order_detail")
        private List<ItemOrderDetail> itemOrderDetail;

        /**
         * 退款结果信息，非商家拒绝退款导致的退款失败，可以通过该字段了解退款失败原因
         */
        @JsonProperty("message")
        private String message;

        /**
         * 系统订单信息，开放平台生成的订单号
         */
        @JsonProperty("order_id")
        private String orderId;

        /**
         * 开发者系统生成的退款单号，与抖音开平退款单号 refund_id 唯一关联
         */
        @JsonProperty("out_refund_no")
        private String outRefundNo;

        /**
         * 系统退款单号，开放平台生成的退款单号
         */
        @JsonProperty("refund_id")
        private String refundId;

        /**
         * 退款来源，仅交易2.0退款有来源，老的担保交易/1.0订单可能没有记录来源
         * 1: 用户发起退款
         * 2: 开放者发起退款
         * 3: 自动退款
         * 4: 抖音客服退款
         * 5: 预约失败自动发起退款
         * 6: 开发者拒绝接单退款
         * 7: 后约单触发先买单退款
         */
        @JsonProperty("refund_source")
        private Integer refundSource;
    }

    @Data
    public static class MerchantAuditDetail implements Serializable {
        /**
         * 退款审核状态：
         * INIT：初始化
         * TOAUDIT：待审核
         * AGREE：同意
         * DENY：拒绝
         * OVERTIME：超时未审核自动同意
         */
        @JsonProperty("audit_status")
        private String auditStatus;

        /**
         * 不同意退款信息，长度 <= 512 byte
         */
        @JsonProperty("need_refund_audit")
        private int needRefundAudit;

        /**
         * 退款审核的最后期限，过期无需审核，自动退款，13 位 unix 时间戳，精度：毫秒
         */
        @JsonProperty("refund_audit_deadline")
        private long refundAuditDeadline;
    }

    @Data
    public static class ItemOrderDetail implements Serializable {
        /**
         * 抖音开平侧的商品单号
         */
        @JsonProperty("item_order_id")
        private String itemOrderId;

        /**
         * 该商品单退款金额，单位[分]
         */
        @JsonProperty("refund_amount")
        private int refundAmount;
    }

}
